﻿#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
#include<assert.h>

//int main() {
//	int a = 10;
//	int* np = &a;
//	printf("%p", np);
//	return 0;
//}

//int main() {
//	int a = 10;
//	int* np = &a;
//	*np = 30;
//	printf("%d", a);
//	return 0;
//}

//int main() {
//	//指针变量的⼤⼩取决于地址的⼤⼩
//	//32位平台下地址是32个bit位（即4个字节）
//	//64位平台下地址是64个bit位（即8个字节）
//	printf("%zd\n", sizeof(int*));
//	printf("%zd\n", sizeof(char*));
//	printf("%zd\n", sizeof(short*));
//	printf("%zd\n", sizeof(double*));
//}

//代码1

//int main()
//{
//	int n = 0x11223344;
//	int* pi = &n;
//	*pi = 0;
//	return 0;
//  //四个byte的值全部变为0。
//}
//代码2



//int main()
//{
//	int n = 0x11223344;
//	char* pc = (char*)&n;
//	*pc = 0;
//	//只将第一块内存的值变为0
//	return 0;
//}

//int main() {
//	int n = 10;
//	int* np = &n;
//	char* ni = (char*)&n;
//	printf("&n   = %p\n", &n);
//	printf("np   = %p\n", np);
//	printf("np+1 = %p\n", np+1);
//	printf("ni   = %p\n", ni);
//	printf("ni+1 = %p\n", ni+1);
//}

//实现一个函数，可以左旋字符串中的k个字符。
//void LeftRound(char* str, int m) {
//	int len = strlen(str);
//	int time = m % len;
//	int i = 0;
//	int j = 0;
//	for (; i < time; i++) {
//		char tmp = str[0];
//		for (j = 0; j < len - 1; j++) {
//			str[j] = str[j + 1];
//		}
//		str[j] = tmp;
//	}
//}
//
//int main() {
//	char str[] = "abcd";
//	LeftRound(str, 3);
//	printf("%s\n", str);
//	return 0;
//}


////const 修饰变量
//int main() {
//	int a = 0;
//	a = 20;
//	int const b = 10;
//	b = 20;  //无法修改
//	return 0;
//}

//const 修饰指针变量
//void test1() {
//	int n = 10;
//	int a = 20;
//	 const int* p = &a;
//	*p = 20; //无法修改
//	p = &n;  //可以修改
//}
//
//void test2() {
//	int n = 10;
//	int a = 20;
//	int* const p = &a;
//	*p = 20;  //可以修改
//	p = &n;   //无法修改
//}
//
//void test3() {
//	int n = 20;
//	int a = 10;
//	const int *const p = &a;
//	*p = 20; //无法修改
//	p = &n;  //无法修改
//}
//
//int mian() {
//	test1();
//	test2();
//	test3();
//	return 0;
//}

//指针运算
//指针+-运算
//int main() {
//	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
//	int i = 0;
//	int sz = sizeof(arr) / sizeof(arr[0]);
//	int* p = arr;
//	for (; i < sz; i++) {
//		printf("%d ", *(p + i));
//	}
//	return 0;
//}

//指针-指针
//int MyStrlen(char* s) {
//	char* p = s;
//	while (*p != '\0')
//		p++;
//	return p - s;
//}
//
//int main() {
//	printf("%d\n", MyStrlen("abcdefhg"));
//	return 0;
//}

//指针的关系运算
//int main() {
//	int arr[] = { 1,2,3,4,5,6,7,8,9 };
//	int* p = arr;
//	int sz = sizeof(arr) / sizeof(arr[0]);
//	while (p < arr + sz) {
//		printf("%d\n", *p);
//		p++;
//	}
//	return 0;
//}


//野指针
//int main() {
//	int* a;    //未初始化指针
//	*a = 20;
//	printf("%p", &a);
//	return 0;
//}


//指针访问越界
//int main() {
//	int arr[] = { 1,2,3,4,5,6,7,8,9 };
//	int i = 0;
//	int* p = arr;
//	for (; i <= 9; i++) {
//		*p = 2;
//		printf("%d ", arr[i]);
//		p++;
//	}
//	return 0;
//}

//指针指向的空间释放
//int* test()
//{
//	int n = 100;
//	return &n;
//}
//int main()
//{
//	int* p = test();  //n的地址被释放，归还给系统
//	printf("%d\n", *p);
//	return 0;
//}

//野指针置NULL
//int main()
//{
//	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
//	int* p = &arr[0];
//	int i = 0;
//	for (i = 0; i < 10; i++)
//	{
//		*(p++) = i;
//	}
//	//此时p已经越界了，可以把p置为NULL
//	p = NULL;
//	//下次使⽤的时候，判断p不为NULL的时候再使⽤
//	//...
//	p = &arr[0];//重新让p获得地址
//	if (p != NULL) //判断
//	{
//		//...
//	}
//	return 0;
//}

//strlen 函数的模拟实现
//int MyStrlen(const char* s) {
//	int count = 0;
//	assert(s);
//	while (*s) {
//		count++;
//		s++;
//	}
//	return count;
//}
//
//int main() {
//	printf("%d", MyStrlen("abcd"));
//	return 0;
//}

//传址调用
//void Swap(int *np, int *nx) {
//	int c = 0;
//	c= *np;
//	*np = *nx;
//	*nx = c;
//}
//
//int main() {
//	int a = 0;
//	int b = 0;
//	scanf("%d %d", &a, &b);
//	printf("a = %d,b = %d\n", a, b);
//	Swap(&a, &b);
//	printf("a = %d,b = %d\n", a, b);
//	return 0;
//}

//传值调用
//int Add(int x, int y) {
//	return x + y;
//}
//
//int main() {
//	int a = 10;
//	int b = 20;
//	int c = Add(a, b);
//	printf("%d", c);
//	return 0;
//}

//字符逆序  相遇
//void Reverse(char* str) {
//	int len = strlen(str);
//	char* left = str;
//	char* right = str + len - 1;
//	int temp = 0;
//	while (left < right) {
//		temp = *left;
//		*left = *right;
//		*right = temp;
//		left++;
//		right--;
//	}
//}
//
//
//int main() {
//	char str[10000]= {0};
//	while (gets(str)) {
//		Reverse(str);
//		printf("%s\n", str);
//	}
//	return 0;
//}

//调整奇数偶数顺序
void Func(int num[], int len) {
	int left = 0;
	int right = len - 1;
	while (left < right) {
		while (left < right && num[left] % 2 != 0)
			left++;
		while (left < right && num[right] % 2 == 0)
			right--;
		int temp = num[left];
		num[left] = num[right];
		num[right] = temp;
	}
}

void Print(int num[], int len) {
	for (int i = 0; i < len; i++) {
		printf("%d ", num[i]);
	}
	printf("\n");
}

int main() {
	int num[] = { 1,2,3,4,5,6};
	int len = sizeof(num) / sizeof(num[0]);
	Func(num, len);
	Print(num, len);
	return 0;
}